package core.reports;

import core.Item;
import core.ItemManager;
import core.Product;
import core.ProductGroup;
import core.ProductManager;
import core.RootStorageUnit;
import core.StorageUnit;

/**
 * This is the interface for all ReportVisitors.  All visitors are in charge of what they do with
 * each node they visit and how they navigate the tree.  How each visitor navigates and gets
 * information from the tree differs in each visitor.  See each individual visitor class for
 * more details.
 * @author Royce
 *
 */
public interface IReportVisitor {
	
	/**
	 * 
	 * @return the TraversingType of this visitor.
	 */
	public TraversingType getType();
	
	/**
	 * Called when the Root Storage Unit is visited.
	 * @param rsu the RootStorageUnit.
	 */
	public void visitRoot(RootStorageUnit rsu);
	
	/**
	 * Called when the Product Manager is visited.
	 * @param pm a reference to the ProductManager.
	 */
	public void visitProductManager(ProductManager pm);
	
	/**
	 * Called when the Item Manager is visited.
	 * @param im a reference to the ItemManager.
	 */
	public void visitItemManager(ItemManager im);
	
	/**
	 * Called when a Storage Unit is visited
	 * @param su a reference to the visited StorageUnit
	 */
	public void visitStorageUnit(StorageUnit su);
	
	/**
	 * Called when a Product Group is visited
	 * @param pg a reference to the visited ProductGroup
	 */
	public void visitProductGroup(ProductGroup pg);
	
	/**
	 * Called when a Product is visited
	 * @param product a reference to the visited Product
	 */
	public void visitProduct(Product product);
	
	/**
	 * Called when an Item is visited
	 * @param item a reference to the visited Item
	 */
	public void visitItem(Item item);
	
	public void onDone();
}
